package com.matu.util;

import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;

import org.ektorp.BulkDeleteDocument;
import org.ektorp.CouchDbConnector;
import org.ektorp.CouchDbInstance;
import org.ektorp.http.HttpClient;
import org.ektorp.http.StdHttpClient;
import org.ektorp.impl.StdCouchDbConnector;
import org.ektorp.impl.StdCouchDbInstance;


public class DB {
	HttpClient httpClient;
	CouchDbInstance dbInstance;
	CouchDbConnector db;
	
	private static String _uri = "http://localhost:5984/";
	    
	public DB() {
		try {
			httpClient = new StdHttpClient.Builder()
				.url(_uri)
                .build();

			dbInstance = new StdCouchDbInstance(httpClient);
			db = new StdCouchDbConnector("wstdb", dbInstance);
            db.createDatabaseIfNotExists();
            
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	/**
	 * Stocke un objet en BD
	 * @param o Objet à stocker
	 */
	public void create(Object o) {
		db.create(o);
	}
	
	
	/**
	 * Efface de la BD un objet
	 * @param o Objet à supprimer
	 */
	public void delete(Object o) {
		db.delete(o);
	}
	
	
	/**
	 * Détruit tous les objets stockés en BD
	 */
	public void clearDB() {
		ArrayList<Object> myObjects = getObjectsInDB();
		ArrayList<Object> bulkDocs = new ArrayList<Object>();
		
		for (Object o : myObjects) {
			bulkDocs.add(BulkDeleteDocument.of(o));
		}
		
		db.executeBulk(bulkDocs);
	}
	
	
	/**
	 * Récupère un objet stocké en BD
	 * @param c
	 * @param id
	 * @return un objet
	 */
	public <T> T getObjectInDB(Class<T> c, String id) {
		return db.get(c, id);
	}
	
	
	/**
	 * Récupère tous les objets stockés en BD 
	 * de la classe séectionnée
	 * @param c Classe sélectionnée
	 * @return liste
	 */
	public <T> ArrayList<T> getClassOfObjectsInDB(Class<T> c) {
		ArrayList<T> myObjects = new ArrayList<T>();
        List<String> idsInDB = db.getAllDocIds();
        
        for (String s : idsInDB) {
        	try {
        		myObjects.add(db.get(c, s));
        	}
        	catch (Exception e) {
        		e.getStackTrace();
        	}
        }
        
        return myObjects;
	}
	
	
	/**
	 * Récupère tous les objets stockés en BD
	 * @return liste
	 */
	public ArrayList<Object> getObjectsInDB() {
		List<String> idsInDB = db.getAllDocIds();
		ArrayList<Object> myObjects = new ArrayList<Object>();
		
		for (String s : idsInDB) {
        	myObjects.add(db.get(Object.class, s));
        }
		
		return myObjects;
	}
	
	
	/**
	 * Indique si un objet est stocké en BD
	 * @param id
	 * @return vrai ou faux
	 */
	public boolean isInDB(String id) {
		return db.contains(id);
	}
	
	
	/**
	 * Met à jour un objet stocké en BD
	 * @param objet
	 */
	public void update(Object objet) {
		db.update(objet);
	}
}
